#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>
#include <unistd.h>
typedef int sem_t;
void print_nsems(sem_t sem_id)
{
    struct semid_ds buf;
    semctl(sem_id, 0, IPC_STAT, &buf);
    printf("nsems = %ld\n", buf.sem_nsems);
}
int main()
{
    char path[64];

    key_t key = ftok(getcwd(path, sizeof(path)), 'a');
    if(key == -1)
    {
        perror("ftok");
        return -1;
    }
    int flags = IPC_CREAT;
    sem_t sem_id = semget(key, 1, flags | 0666);
    if(sem_id == -1)
    {
        perror("semget");
        return -1;
    }
    print_nsems(sem_id);
    int value = 0;
    if(-1 == semctl(sem_id, 0, SETVAL, 100))
    {
        perror("semctl_1");
    }
    value = semctl(sem_id, 0, GETVAL);
    printf("sem value = %d\n", value);
    struct sembuf sbuf;
    sbuf.sem_flg = IPC_NOWAIT;
    sbuf.sem_op = -20;
    sbuf.sem_num = 0;
    if(-1 == semop(sem_id,&sbuf,1))
    {
        perror("semop");
    }
    value = semctl(sem_id, 0, GETVAL);
    printf("sem value = %d\n", value);
    sbuf.sem_op = +10;
    semop(sem_id,&sbuf, 1);
    value = semctl(sem_id, 0, GETVAL);
    printf("sem value = %d\n", value);
    // delete
    semctl(sem_id,0, IPC_RMID);
    return 0;
}
